package ru.cod.rs.exmpls.main.interfaces.impl;

import ru.cod.rs.exmpls.main.abstractions.Screen;
import ru.cod.rs.exmpls.main.interfaces.Audio;
import ru.cod.rs.exmpls.main.interfaces.FileIO;
import ru.cod.rs.exmpls.main.interfaces.Game;
import ru.cod.rs.exmpls.main.interfaces.Graphics;
import ru.cod.rs.exmpls.main.interfaces.Input;
import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.view.Window;
import android.view.WindowManager;

public class AndroidGame extends Activity implements Game {

	AndroidFastRenderView renderView;

	Graphics graphics;

	Audio audio;

	Input input;

	FileIO fileIO;

	Screen screen;

	WakeLock wakeLock;

	@Override
	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);

		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);

		boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
		int frameBufferWidth = isLandscape ? 480 : 320;
		int frameBufferHeight = isLandscape ? 320 : 480;
		Bitmap frameBuffer = Bitmap.createBitmap(frameBufferWidth,
				frameBufferHeight, Config.RGB_565);

		float scaleX = (float) frameBufferWidth
				/ getWindowManager().getDefaultDisplay().getWidth();
		float scaleY = (float) frameBufferHeight
				/ getWindowManager().getDefaultDisplay().getHeight();

		renderView = new AndroidFastRenderView(this, frameBuffer);
		graphics = new GraphicsImpl(getAssets(), frameBuffer);
		fileIO = new FileIOImpl(getAssets());
		// audio = new AudioImpl(this);
		input = new InputImpl(this, renderView, scaleX, scaleY);
		screen = getStartScreen();
		setContentView(renderView);

		PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
		wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK,
				"GLGame");
	}

	@Override
	public Input getInput() {

		return input;
	}

	@Override
	public FileIO getFileIO() {

		return fileIO;
	}

	@Override
	public Graphics getGraphics() {

		return graphics;
	}

	@Override
	public Audio getAudio() {

		return audio;
	}

	@Override
	public void setScreen(Screen screen) {

		if (screen == null) {
			throw new IllegalArgumentException("Screen must not be null");
		}
		this.screen.pause();
		this.screen.dispose();
		screen.resume();
		screen.update(0);
		this.screen = screen;
	}

	@Override
	public Screen getCurrentScreen() {

		return screen;
	}

	@Override
	public void onResume() {

		super.onResume();
		wakeLock.acquire();
		screen.resume();
		renderView.resume();
	}

	@Override
	public void onPause() {

		super.onPause();
		wakeLock.release();
		renderView.pause();
		screen.pause();
		if (isFinishing()) {
			screen.dispose();
		}
	}

	@Override
	public Screen getStartScreen() {
		// TODO Auto-generated method stub
		return null;
	}

}
